package com.prj.ufdm.demo.tutorial.j2se.hashcode;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

/**
 * DESC: HashCode 测试 <br>
 * @author 胡义振
 * @date 2020年3月10日
 */
public class HashCodeTest {

	public static void main(String[] args) {
		
		Collection collection = new ArrayList();
		
		HashObject obj1 = new HashObject(3, 2);
		HashObject obj2 = new HashObject(3, 3);
		HashObject obj3 = new HashObject(5, 5);
		HashObject obj4 = new HashObject(3, 2);
		
		// HashObject 覆盖 hashCode 与 equals 方法（只让经纬度参加运算）后， obj1 对象 与 obj4 相等
		System.out.println("\n 覆盖HashCode后，两个对象比较结果："+obj1.equals(obj4));
		
		collection.add(obj1);
		collection.add(obj2);
		collection.add(obj3);
		collection.add(obj4);
		
		// ArrayList 非按照 Hash算法存储，长度为 4
		System.out.println("\n ArrayList 长度："+collection.size());
		
		Collection collection1 = new HashSet();
		collection1.add(obj1);
		collection1.add(obj2);
		collection1.add(obj3);
		collection1.add(obj4);
		
		// HashSet 按照 Hash算法存储，长度为 3
		System.out.println("\n HashSet 长度："+collection1.size());
		
		// 把 obj1 中的 经度 值改变，此时Hash值已经不同，此时移除 obj1 后， collection1 长度还是3，会造成内存泄漏
		obj1.setLongitude(5);
		collection1.remove(obj1);
		System.out.println("\n HashSet 改变对象值移除后长度："+collection1.size());
		
		// 所以HashCode只对使用Hash算法进行存储的类才有效，像 HashTable,HashSet 等
		
	}
}
